package com.bj58.mis.apm.server.statistics.mapper;

import com.bj58.mis.apm.server.statistics.dto.cube.*;
import com.bj58.mis.apm.server.statistics.query.PageInfo;
import com.bj58.mis.apm.server.statistics.query.cube.CubeQuery;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * @author: zhangfx
 * @create: 2018-06-25 17:52
 **/
@Mapper
public interface CubeMapper {
    /**
     * 查询Cube列表总条数
     * @param isAdmin 是否管理员，管理员有所有Cube权限
     * @param authCubeIdList 有权限的Cube ID列表，非管理员时使用
     * @param cubeQuery 其他查询条件
     * @return
     */
    long queryCount(@Param("isAdmin") boolean isAdmin,
                    @Param("authCubeIdList") List<String> authCubeIdList,
                    @Param("cubeQuery") CubeQuery cubeQuery);

    /**
     * 分页查询Cube列表数据
     * @param isAdmin 是否管理员，管理员有所有Cube权限
     * @param authCubeIdList 有权限的Cube ID列表，非管理员时使用
     * @param cubeQuery 其他查询条件
     * @param pageInfo 分页信息
     * @return
     */
    List<CubeInfo> queryPage(@Param("isAdmin") boolean isAdmin,
                             @Param("authCubeIdList") List<String> authCubeIdList,
                             @Param("cubeQuery") CubeQuery cubeQuery,
                             @Param("pageInfo") PageInfo pageInfo);

    /**
     * 根据id查询Cube
     * @param id
     * @return
     */
    CubeInfo get(String id);

    /**
     * 根据cubeId查询Cube设计相关信息
     * @param cubeId
     * @return
     */
    Map<String, Object> getDesign(String cubeId);


    /**
     * 根据cubeId查询Cube分区信息
     * @param cubeId
     * @return
     */
    List<Segment> getSegments(String cubeId);

    /**
     * 根据cubeId查询Cube模型
     * @param cubeId
     * @return
     */
    Map<String, Object> getModel(String cubeId);

    /**
     * 查询Cube统计信息
     * @param isAdmin 是否管理员，管理员有所有Cube权限
     * @param authCubeIdList 有权限的Cube ID列表，非管理员时使用
     * @param projectId 可选参数
     * @return
     */
    CubeStatistics queryStatistics(@Param("isAdmin") boolean isAdmin,
                                   @Param("authCubeIdList") List<String> authCubeIdList,
                                   @Param("projectId") String projectId);

    /**
     * 查询Cube纬度使用率最低TOP10!
     * @param isAdmin 是否管理员，管理员有所有Cube权限
     * @param authCubeIdList 有权限的Cube ID列表，非管理员时使用
     * @param projectId 可选参数
     * @return
     */
    List<Map<String,Object>> queryTop10LowestUsageColumn(@Param("isAdmin") boolean isAdmin,
                                                         @Param("authCubeIdList") List<String> authCubeIdList,
                                                         @Param("projectId") String projectId);

    /**
     * 查询Cube膨胀倍数TOP10!
     * @param isAdmin 是否管理员，管理员有所有Cube权限
     * @param authCubeIdList 有权限的Cube ID列表，非管理员时使用
     * @param projectId 可选参数
     * @return
     */
    List<Map<String,Object>> queryTop10SwellRatio(@Param("isAdmin") boolean isAdmin,
                                                  @Param("authCubeIdList") List<String> authCubeIdList,
                                                  @Param("projectId") String projectId);

    /**
     * 查询Cube查询次数TOP10
     * @param isAdmin 是否管理员，管理员有所有Cube权限
     * @param authCubeIdList 有权限的Cube ID列表，非管理员时使用
     * @param projectId 可选参数
     * @param startDate
     * @param endDate
     * @return
     */
    List<Map<String,Object>> queryTop10MostUsedQuery(@Param("isAdmin") boolean isAdmin,
                                                     @Param("authCubeIdList") List<String> authCubeIdList,
                                                     @Param("projectId") String projectId,
                                                     @Param("startDate") String startDate,
                                                     @Param("endDate") String endDate);
    /**
     * 查询Cube慢查询次数TOP10
     * @param isAdmin 是否管理员，管理员有所有Cube权限
     * @param authCubeIdList 有权限的Cube ID列表，非管理员时使用
     * @param projectId 可选参数
     * @param startDate
     * @param endDate
     * @return
     */
    List<Map<String,Object>> queryTop10SlowQuery(@Param("isAdmin") boolean isAdmin,
                                                 @Param("authCubeIdList") List<String> authCubeIdList,
                                                 @Param("projectId") String projectId,
                                                 @Param("startDate") String startDate,
                                                 @Param("endDate") String endDate);
    /**
     * 查询Cube构建时间TOP10
     * @param isAdmin 是否管理员，管理员有所有Cube权限
     * @param authCubeIdList 有权限的Cube ID列表，非管理员时使用
     * @param projectId 可选参数
     * @return
     */
    List<Map<String,Object>> queryTop10SlowBuild(@Param("isAdmin") boolean isAdmin,
                                                 @Param("authCubeIdList") List<String> authCubeIdList,
                                                 @Param("projectId") String projectId);
    /**
     * 查询Cube数据量占用TOP10!   单位：GB
     * @param isAdmin 是否管理员，管理员有所有Cube权限
     * @param authCubeIdList 有权限的Cube ID列表，非管理员时使用
     * @param projectId 可选参数
     * @return
     */
    List<Map<String,Object>> queryTop10DataSize(@Param("isAdmin") boolean isAdmin,
                                                @Param("authCubeIdList") List<String> authCubeIdList,
                                                @Param("projectId") String projectId);

    /**
     * 查询Cube膨胀率范围统计!
     * @param isAdmin 是否管理员，管理员有所有Cube权限
     * @param authCubeIdList 有权限的Cube ID列表，非管理员时使用
     * @param projectId 可选参数
     * @return
     */
    List<Map<String,Object>> querySwellRangeStatistics(@Param("isAdmin") boolean isAdmin,
                                                       @Param("authCubeIdList") List<String> authCubeIdList,
                                                       @Param("projectId") String projectId);
}
